/*******************************************************
 * UNIFOR     - Universidade de Fortaleza              *
 * MIA        - Mestrado em Inform�tica Aplicada       *
 * Disciplina - Modelagem Num�rica                     *
 * Aluno      - Hermano Albuquerque Lira               *
 * Professor  - Furlan                                 *
 *                                                     *
 *                 Trabalho Final                      *
 *                                                     *
 *******************************************************/
package br.unifor.modelagem.numerica;

import java.util.Arrays;
import java.util.ResourceBundle;

import br.unifor.modelagem.numerica.trabalhofinal.Configuration;
import br.unifor.modelagem.numerica.trabalhofinal.Estatistica;
import br.unifor.modelagem.numerica.trabalhofinal.IMatriz;
import br.unifor.modelagem.numerica.trabalhofinal.Matriz;
import br.unifor.modelagem.numerica.trabalhofinal.TipoEstatistica;
import br.unifor.modelagem.numerica.trabalhofinal.TipoIndividuo;

public class Main {

	public static void main(String[] args) {
	
		Configuration config = carregaEntrada("parametros_entrada");
		
		// Instancia uma matriz
		IMatriz matriz = new Matriz(config.getTamanhoMatriz());
		//IMatriz matriz = new MastrizMock(); // Teste
				
		// Seta posicao do infectado
		matriz.setIndividuo(TipoIndividuo.INFECTADO, config.getLinhaInfectado(), config.getColunaInfectado());
		
		// Obtem quantidade de imunes e gera posicoes aleatorias
		matriz.populaRandomico(TipoIndividuo.IMUNE, config.getQuantidadeImunes());
		
		// Obtem quantidade de pseudo-imunes e gera posicoes aleatorias
		matriz.populaRandomico(TipoIndividuo.PSEUDO_IMUNE, config.getQuantidadePseudoImunes());

		// Exibe Matriz inicial (Antes da primeira atualizacao)
		System.out.println("Matriz Inicial");
		System.out.println("--------------");
		System.out.println(matriz);
	
		for (int i = 1 ; i <= config.getQuantidadeAtualizacoes() ; i++) {
			// O individuo infectado devera infectar os seus 4 vizinhos (nao pode infectar os vizinhos da diagonal)
			matriz.atualizar();
			
			System.out.println("Atualizacao " + i);
			System.out.println("--------------");
			// Imprime a matriz apos a atualizacao.
			System.out.println(matriz);
			
			// Imprime Estatistica da Atualizacao corrente
			Estatistica.getEstatisticaAtual().imprimirTotaisAtual();
		}
		
		// Imprime Estatisticas Gerais
		Estatistica.imprimirMedias();
		Estatistica.imprimirDeviosPadroes();
		Estatistica.imprimirMedianas();
		
		imprimirDistribuicaoInfectados();
	}

	private static void imprimirDistribuicaoInfectados() {

		ClasseDistribuicao[] distrFrequencia = Estatistica.distribuicao(TipoEstatistica.INFECTADO);
		
		System.out.println("---Copiar valores abaixo e colar na coluna de 'INFECTADO' no excel---");
		for (int i = 0 ; i < distrFrequencia.length ; i++) {	
			System.out.println(distrFrequencia[i]);
		}
		System.out.println("---Copiar valores acima e colar na coluna de 'INFECTADO' no excel---");
		
	}

	private static Configuration carregaEntrada(String baseFilename) {
		
		ResourceBundle rb = ResourceBundle.getBundle(baseFilename);
		
		/*
		 * Ordem de entrada de dados:
		 * 
		 * tamanhoMatriz 
		 * linhaInfectado
		 * colunaInfectado
		 * morteInfectado
		 * quantidadeImunes
		 * quantidadePseudoImunes
		 * percentualPseudoImunes
		 * idadeMortePseudoImunes
		 * idadeMorteSadiosImunes
		 * atualizacoes
		 */
		return Configuration.createInstance(
				Integer.valueOf(rb.getString("matriz.tamanho")),
				Integer.valueOf(rb.getString("infectado.linha")),
				Integer.valueOf(rb.getString("infectado.coluna")),
				Integer.valueOf(rb.getString("infectado.morte")),
				Integer.valueOf(rb.getString("imunes.quantidade")),
				Integer.valueOf(rb.getString("pseudo_imunes.quantidade")),
				Integer.valueOf(rb.getString("pseudo_imunes.percentual")),
				Integer.valueOf(rb.getString("pseudo_imunes.idadeMorte")),
				Integer.valueOf(rb.getString("sadios_imunes.idadeMorte")),
				Integer.valueOf(rb.getString("atualizacoes")));
	}
}